home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / tex / macros / nice20.zoo / nice.tex (.txt) < prev    next >
LaTeX Document  |  1990-09-18  |  20KB  |  457 lines

  1. % NICE Version 2 macro package for plain TeX
  2. % written by
  3. %   Christian Rank
  4. %   Br\"augasse 13/225
  5. %   D-8390 Passau
  6. %   E-Mail: rank@unipas.fmi.uni-passau.de
  7. %   (please don't e-mail from outside Germany!)
  8. % THIS MACRO PACKAGE MAY BE COPIED AND USED FREELY ONLY IN THIS ORIGINAL STATE
  9. % WITHOUT ANY CHANGES.
  10. % TO PRESERVE COMPATIBILITY, PLEASE DO NOT MODIFY THIS FILE UNDER ANY
  11. % CIRCUMSTANCES. YOU CAN CUSTOMIZE THE NICE PACKAGE FOR YOUR NEEDS VIA AN
  12. % AUXILIARY FILE WHICH READS IN NICE.TEX AND THEN CHANGES PARAMETERS
  13. % AND/OR DEFINES ADDITIONAL COMMANDS.
  14. % we check first if NICE has already been read, in which case we do not need
  15. % to define the NICE macros again.
  16. \expandafter\ifx\csname niceversion\endcsname \relax \else \endinput \fi
  17. % NICE hasn't already been read, so we continue
  18. \def\niceversion{2.0}
  19. \def\versionof {17/09/90}
  20. \immediate\write16 {NICE version \niceversion, (c) 1990 by C. Rank}
  21. \everyjob {\immediate\write16 {NICE version \niceversion \space of \versionof}}
  22. \catcode`\@=11 % for definition of private macros
  23. % adjustment of general parameters
  24. \vsize 9.2truein \hsize 6.5truein % page layout
  25. \baselineskip=12pt \lineskiplimit=0pt \lineskip=0pt
  26. \smallskipamount=6pt plus 1pt minus 1pt
  27. \medskipamount=12pt plus 2pt minus 2pt
  28. \bigskipamount=18pt plus 3pt minus 3pt
  29. \parskip=6pt plus 1pt minus 1pt
  30. \parindent=0pt
  31. \tolerance=10000
  32. \hbadness=5000
  33. % the fonts used
  34. \font\documenttitlefont=cmr10 scaled \magstep4
  35. \font\sectiontitlefont=cmbx10 scaled \magstep2
  36. \font\subsectiontitlefont=cmbx10 scaled \magstep1
  37. \font\subsubsectiontitlefont=cmbx10 scaled \magstephalf
  38. % fonts used for variable size styles
  39. \font\ninerm=cmr9 \font\eightrm=cmr8 \font\sixrm=cmr6
  40. \font\ninei=cmmi9 \font\eighti=cmmi8 \font\sixi=cmmi6
  41. \font\ninesy=cmsy9 \font\eightsy=cmsy8 \font\sixsy=cmsy6
  42. \font\ninebf=cmbx9 \font\eightbf=cmbx8 \font\sixbf=cmbx6
  43. \font\ninesl=cmsl9 \font\eightsl=cmsl8
  44. \font\ninett=cmtt9 \font\eighttt=cmtt8
  45. \font\nineit=cmti9 \font\eightit=cmti8 \font\sevenit=cmti7
  46. % the variable size styles
  47. \def\ninept{\textfont0=\ninerm \scriptfont0=\sevenrm
  48.         \scriptscriptfont0=\fiverm
  49.         \def\rm{\fam0 \ninerm}
  50.         \textfont1=\ninei \scriptfont1=\seveni \scriptscriptfont1=\fivei
  51.         \def\oldstyle{\fam1 \ninei}
  52.         \textfont2=\ninesy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
  53.         \textfont\itfam=\nineit \def\it{\fam\itfam \nineit}
  54.         \textfont\slfam=\ninesl \def\sl{\fam\slfam \ninesl}
  55.         \textfont\bffam=\ninebf \scriptfont\bffam=\sevenbf
  56.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \ninebf}
  57.         \textfont\ttfam=\ninett \def\tt{\fam\ttfam \ninett}
  58.         \baselineskip=11pt
  59.         \rm
  60. \def\eightpt{\textfont0=\eightrm \scriptfont0=\sixrm
  61.         \scriptscriptfont0=\fiverm
  62.         \def\rm{\fam0 \eightrm}
  63.         \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
  64.         \def\oldstyle{\fam1 \eighti}
  65.         \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  66.         \textfont\itfam=\eightit \def\it{\fam\itfam \eightit}
  67.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  68.         \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
  69.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \eightbf}
  70.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  71.         \baselineskip=10pt
  72.         \rm
  73. \def\sevenpt{\textfont0=\sevenrm \scriptfont0=\sixrm
  74.         \scriptscriptfont0=\fiverm
  75.         \def\rm{\fam0 \sevenrm}
  76.         \textfont1=\seveni \scriptfont1=\sixi \scriptscriptfont1=\fivei
  77.         \def\oldstyle{\fam1 \seveni}
  78.         \textfont2=\sevensy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  79.         \textfont\itfam=\sevenit \def\it{\fam\itfam \sevenit}
  80.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  81.         \textfont\bffam=\sevenbf \scriptfont\bffam=\sixbf
  82.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \sevenbf}
  83.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  84.         \baselineskip=9pt
  85.         \rm
  86. \def\sixpt{\textfont0=\sixrm \scriptfont0=\fiverm
  87.         \scriptscriptfont0=\fiverm
  88.         \def\rm{\fam0 \sixrm}
  89.         \textfont1=\sixi \scriptfont1=\fivei \scriptscriptfont1=\fivei
  90.         \def\oldstyle{\fam1 \sixi}
  91.         \textfont2=\sixsy \scriptfont2=\fivesy \scriptscriptfont2=\fivesy
  92.         \textfont\itfam=\sevenit \def\it{\fam\itfam \sevenit}
  93.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  94.         \textfont\bffam=\sixbf \scriptfont\bffam=\fivebf
  95.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \sixbf}
  96.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  97.         \baselineskip=8pt
  98.         \rm
  99. \def\fivept{\textfont0=\fiverm \scriptfont0=\fiverm
  100.         \scriptscriptfont0=\fiverm
  101.         \def\rm{\fam0 \fiverm}
  102.         \textfont1=\fivei \scriptfont1=\fivei \scriptscriptfont1=\fivei
  103.         \def\oldstyle{\fam1 \fivei}
  104.         \textfont2=\fivesy \scriptfont2=\fivesy \scriptscriptfont2=\fivesy
  105.         \textfont\itfam=\sevenit \def\it{\fam\itfam \sevenit}
  106.         \textfont\slfam=\eightsl \def\sl{\fam\slfam \eightsl}
  107.         \textfont\bffam=\fivebf \scriptfont\bffam=\fivebf
  108.         \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam \fivebf}
  109.         \textfont\ttfam=\eighttt \def\tt{\fam\ttfam \eighttt}
  110.         \baselineskip=7pt
  111.         \rm
  112. % this stuff defines a macro `include', which has the same effect as plain
  113. % TeX's `input', except that it is no error if the file does not exist.
  114. \newread\testinclude
  115. \def\include#1{\immediate\openin\testinclude #1
  116.         \ifeof\testinclude \immediate\write16 {No file #1.}
  117.         \else \immediate\closein\testinclude \input #1
  118.         \fi}
  119. % general utilities
  120. \def\newpage{\vfill\eject}
  121. \def\\{$\backslash$}
  122. \def\raggedcenter{\leftskip=0pt plus 4em \rightskip=\leftskip
  123.         \parfillskip=0pt \spaceskip=.3333em \xspaceskip=.5em
  124.         \pretolerance=9999 \tolerance=9999 \hbadness=10000
  125.         \hyphenpenalty=9999 \exhyphenpenalty=9999}
  126. \def\parwithoutskip{{\parskip=0pt plus 0.5pt\par\noindent}\ignorespaces}
  127. \newdimen\narrowskip \narrowskip=20pt
  128. \def\lnarrower{\advance\leftskip by \narrowskip}
  129. \let\onarrower=\narrower
  130. \def\narrower{\advance\leftskip by \narrowskip
  131.         \advance\rightskip by \narrowskip}
  132. \def\tw@num#1{\ifnum#1>9 #1\else 0#1\fi}
  133. \def\date{\tw@num{\the\day}/\tw@num{\the\month}/\the\year}
  134. \def\ifndef#1{\expandafter\ifx\csname#1\endcsname\relax}
  135. % title and section layout
  136. \long\def\title#1{{\raggedcenter \documenttitlefont #1 \par}}
  137. \def\titlepage{\begingroup
  138.         \def\title##1{{\raggedcenter \documenttitlefont ##1 \par}\medskip}
  139.         \long\def\author##1{{\parskip=0pt \raggedcenter \rm ##1 \par}}
  140.         \def\release##1{\centerline{\bf ##1}}
  141.         \def\abstract{\centerline{\bf Abstract}\narrowskip=3truecm \narrower}
  142.         \def\endtitlepage{\vfil\egroup \newpage \endgroup}
  143.         \vbox to \vsize \bgroup \vfil}
  144. \newcount\sectionno \sectionno=0
  145. \newcount\subsectionno
  146. \newcount\subsubsectionno
  147. \newtoks\sectionnscheme
  148. \sectionnscheme={\gensect. }
  149. \newtoks\subsectionnscheme
  150. \subsectionnscheme={\gensect.\number\subsectionno. }
  151. \newtoks\subsubsectionnscheme
  152. \subsubsectionnscheme={\gensect.\number\subsectionno
  153.         .\number\subsubsectionno. }
  154. \def\genheading#1#2#3{\vskip\parskip \vbox{
  155.         \setbox0 \hbox{#1#2} \hangindent=\the\wd0 \hangafter=1
  156.         \noindent \raggedright \pretolerance=10000 \box0 #1#3\par}}
  157. \def\gensect{\ifnum \sectionno<0 \char\number-\sectionno
  158.         \else \number\sectionno\fi}
  159. \def\plainsection#1{\removelastskip
  160.         \bigskip
  161.         \genheading{\sectiontitlefont}{}{#1}
  162.         \ifnum\contentslevel>0
  163.         {\let\the=0 \edef\next{\write\fcontents
  164.                 {\vskip\contskip \hbox to \hsize
  165.                 {\scstyle \hskip\the\scindent #1 \the\contfill\ 
  166.                  \the\pageno}}}\next}
  167.         \immediate\write16 {#1}
  168.         \fi
  169.         \ifnum\marklevel>0 \mark {#1} \fi
  170.         \nobreak}
  171. \def\section#1{\removelastskip
  172.         \bigskip
  173.         \ifnum \sectionno<-1 \global\advance\sectionno by -1
  174.         \else \global\advance\sectionno by 1
  175.         \fi
  176.         \global\subsectionno=0
  177.         \genheading{\sectiontitlefont}{\the\sectionnscheme}{#1}
  178.         {\edef\nscheme{\the\sectionnscheme}
  179.         \ifnum\contentslevel>0
  180.         {\let\the=0 \edef\next{\write\fcontents
  181.                 {\vskip\contskip \hbox to \hsize
  182.                 {\scstyle \hskip\the\scindent \nscheme #1 \the\contfill\
  183.                 \the\pageno}}}\next}
  184.         \immediate\write16 {\nscheme #1}
  185.         \fi
  186.         \ifnum\marklevel>0 \mark {\nscheme #1} \fi
  187.         }
  188.         \nobreak}
  189. \def\subsection#1{\removelastskip
  190.         \smallskip
  191.         \global\advance\subsectionno by 1 \global\subsubsectionno=0
  192.         \genheading{\subsectiontitlefont}{\the\subsectionnscheme}{#1}
  193.         {\edef\nscheme{\the\subsectionnscheme}
  194.         \ifnum\contentslevel>1
  195.         {\let\the=0 \edef\next{\write\fcontents
  196.                 {\hbox to \hsize
  197.                 {\sscstyle \hskip\the\sscindent \nscheme #1 \the\contfill\ 
  198.                 \the\pageno}}}\next}
  199.         \immediate\write16 {\nscheme #1}
  200.         \fi
  201.         \ifnum\marklevel>1 \mark {\nscheme #1} \fi
  202.         }
  203.         \nobreak}
  204. \def\subsubsection#1{
  205.         \par
  206.         \global\advance\subsubsectionno by 1
  207.         \genheading{\subsubsectiontitlefont}{\the\subsubsectionnscheme}{#1}
  208.         {\edef\nscheme{\the\subsubsectionnscheme}
  209.         \ifnum\contentslevel>2
  210.         {\let\the=0 \edef\next{\write\fcontents
  211.                 {\hbox to \hsize
  212.                 {\ssscstyle \hskip\the\ssscindent \nscheme #1 \the\contfill\
  213.                 \the\pageno}}}\next}
  214.         \immediate\write16 {\nscheme #1}
  215.         \fi
  216.         \ifnum\marklevel>2 \mark {\nscheme #1} \fi
  217.         }
  218.         \nobreak}
  219. \def\appendix{\global\sectionno=-64\relax}
  220. % macros for making a table of contents
  221. \newtoks\contfill
  222. \contfill={\hfil}
  223. \newskip\contskip \contskip=0pt % additional skip between section headings
  224.                                 % in contents table
  225. \newcount\contentslevel \contentslevel=0
  226. \newwrite\fcontents
  227. \def\makevoidcontents{
  228.         \openout\fcontents \jobname.toc
  229.         \ifnum\contentslevel=0 \global\contentslevel=1 \fi
  230.         \immediate\write16 {Writing contents on \jobname.toc.}
  231.         }
  232. \def\makecontents{
  233.         \catcode`\@=11
  234.         \include {\jobname.toc}
  235.         \catcode`@=12
  236.         \makevoidcontents
  237.         }
  238. \newdimen\scindent
  239. \newdimen\sscindent
  240. \newdimen\ssscindent % please forgive me;
  241.                      % i know it's a horrible abbreviation
  242. \scindent=0pt
  243. \sscindent=12pt
  244. \ssscindent=32pt
  245. \let\scstyle=\rm
  246. \let\sscstyle=\rm
  247. \let\ssscstyle=\rm % please forgive me once again ...
  248. % footnotes
  249. \let\ovfootnote=\vfootnote
  250. \newdimen\footnoteindent
  251. \footnoteindent=20pt
  252. \def\vfootnote#1{\insert\footins\bgroup
  253.   \parindent=\footnoteindent % change
  254.   \ifndef{footnotestyle} \baselineskip=\fbaselineskip \footfont
  255.   \else \footnotestyle \fi
  256.   \interlinepenalty\interfootnotelinepenalty
  257.   \splittopskip\ht\strutbox % top baseline for broken footnotes
  258.   \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
  259.   \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
  260.   \def\par{\endgraf \hangindent=\footnoteindent \hangafter=1}
  261.   \hangindent=\footnoteindent \hangafter=1
  262.   \textindent{#1}\footstrut\futurelet\next\fo@t}
  263. \let\plainfootnote=\footnote
  264. \newcount\footno \footno=0
  265. \newskip\fbaselineskip \fbaselineskip=\baselineskip
  266. \font\footfont=cmr10
  267. \def\footnote{\global\advance\footno by 1
  268.         \plainfootnote{\hbox{$^{\the\footno}$}}
  269.         }
  270. \long\def\f@t#1{#1\@foot} % enable \par in footnotes
  271. % defs for staggered layout
  272. \newbox\staggbox
  273. \def\staggered#1{\begingroup
  274.         \setbox\staggbox \hbox {#1}
  275.         \edef\key##1{\par \hangindent=\the\wd\staggbox \hangafter=1
  276.                 \noindent \hbox to \the\wd\staggbox {##1\hfil}\ignorespaces}
  277.         \def\endstaggered{\endgraf \endgroup}
  278.         \skip0=\hangindent
  279.         \parskip=0pt plus 0.5pt \vskip\parskip
  280.         \advance \leftskip by \skip0
  281.         \def\par{\endgraf \hangindent=\the\wd\staggbox \hangafter=0}
  282.         }
  283. \def\itemlist#1{\begingroup
  284.         \setbox\staggbox \hbox {#1}
  285.         \edef\next{\par \hangindent=\the\wd\staggbox \hangafter=1
  286.                 \noindent \hbox{#1}\ignorespaces}
  287.         \def\enditemlist{\endgraf \endgroup}
  288.         \skip0=\hangindent
  289.         \parskip=0pt plus 0.5pt \vskip\parskip
  290.         \advance \leftskip by \skip0
  291.         \def\par{\endgraf \hangindent=\the\wd\staggbox \hangafter=0}
  292.         }
  293. \newcount\itemno
  294. \def\numbered#1{\ifcase #1 \staggered {0. } \or \staggered {0. } \or
  295.         \staggered {00. } \or \staggered {000. } \fi
  296.         \itemno=0
  297.         \def\next{\advance \itemno by 1 \key {\hfill \the\itemno. }}
  298.         \def\endnumbered{\endstaggered}
  299.         }
  300. \def\alphanumbered{\staggered {m) }
  301.         \itemno=96
  302.         \def\next{\advance \itemno by 1 \key {\char\itemno ) }}
  303.         \def\endalphanumbered{\endstaggered}
  304.         }
  305. \def\pnumbered{\staggered{(0) }
  306.         \itemno=0
  307.         \def\next{\advance \itemno by 1 \key {(\the\itemno)}}
  308.         \def\endpnumbered{\endstaggered}
  309.         }
  310. \def\prnumbered{\staggered{(iii) }
  311.         \itemno=0
  312.         \def\next{\advance \itemno by 1 \key {(\romannumeral\itemno)}}
  313.         \def\endprnumbered{\endstaggered}
  314.         }
  315. % the style for headlines and footlines
  316. \newcount\marklevel \marklevel=1
  317. \newdimen\hdrulepos \hdrulepos=-2pt
  318. \def\hdrule{\kern\hdrulepos \hrule}
  319. \def\book{
  320.         \headline={\ifnum\pageno>1\vbox
  321.                 {\line{\strut \ifodd\pageno \tenit\firstmark\hfil\tenbf\folio
  322.                 \else \tenbf\folio\hfil\tenit\firstmark \fi}\hdrule}\else
  323.                 \hfil \fi}
  324.         \footline={\hfil}
  325. \def\article{
  326.         \headline={\ifnum\pageno>1\vbox
  327.                 {\line{\strut \tenit\firstmark\hfil\tenbf\folio}\hdrule}\else
  328.         \hfil \fi}
  329.         \footline={\hfil}
  330. % macros for verbatim mode
  331. \font\verbatimfont=cmtt10
  332. \newskip\vbaselineskip
  333. \vbaselineskip=\baselineskip
  334. \let\d@specials=\dospecials
  335. \def\uncatcodespecials{\def\do##1{\catcode`##1=12}\dospecials}
  336. \def\beginverbatim{\par\begingroup \let\oldpar=\par
  337.         \ifndef{verbatimstyle} \baselineskip=\vbaselineskip \verbatimfont
  338.         \else \verbatimstyle\tt \fi
  339.         \noindent\parskip=0pt
  340.         \catcode`|=12
  341.         \setupverbatim \doverbatim}
  342. {\catcode`\|=0 \catcode`\\=12
  343.  |obeylines|gdef|doverbatim^^M#1\endverbatim{#1|endgroup}}
  344. \def\setupverbatim{\def\par{\leavevmode\oldpar}\catcode`\`=\active
  345.         \obeylines \uncatcodespecials \obeyspaces}
  346. {\obeyspaces\global\let =\ }
  347. {\catcode`\`=\active \gdef`{\relax\lq}}
  348. % macros for verbatim mode inside paragraph
  349. \def\spvert{\ifmmode\def\n@xt{|}\else\let\n@xt=\txver\fi\n@xt}
  350. \catcode`\|=\active \let |=\spvert
  351. {\obeylines\gdef\txver{\begingroup\tt\setupverbatim\let^^M=\ \let|=\endgroup}}
  352. % this defines the environment for \usemathsymbols
  353. {\catcode`|=12
  354. \global\let\nice@mvert=|
  355. \let\nice@mlt=<
  356. \let\nice@mgt=>
  357. \let\nice@mlbr=\{
  358. \let\nice@mrbr=\}
  359. \def\{{\ifmmode \nice@mlbr \else $\nice@mlbr$\fi}
  360. \def\}{\ifmmode \nice@mrbr \else $\nice@mrbr$\fi}
  361. \catcode`\|=\active
  362. \catcode`\<=\active
  363. \catcode`\>=\active
  364. \gdef\usemathsymbols{
  365.         \catcode`\|=\active
  366.         \catcode`\<=\active
  367.         \catcode`\>=\active
  368.         \def|{\ifmmode \nice@mvert \else $\nice@mvert$\fi}
  369.         \def<{\ifmmode \nice@mlt \else $\nice@mlt$\fi}
  370.         \def>{\ifmmode \nice@mgt \else $\nice@mgt$\fi}
  371.         \let\d@@specials=\dospecials
  372.         \def\dospecials{\d@@specials \do \< \do \>}
  373. % cross references
  374. \newwrite\frefs
  375. \def\userefs{
  376.         \catcode`\@=11
  377.         \include {\jobname.crf}
  378.         \catcode`@=12
  379.         \openout\frefs \jobname.crf
  380.         \immediate\write16 {Writing references on \jobname.crf.}
  381.         }
  382. {\catcode`\|=0 \catcode`\\=12
  383. |gdef|escapeit{\}
  384. \def\label#1{{\let\the=0\edef\next{\write\frefs
  385.         {\def\noexpand\escapeit rs@#1{\number\sectionno
  386.         \ifnum\subsectionno=0 \else
  387.                 .\number\subsectionno
  388.         \ifnum\subsubsectionno=0 \else
  389.                 .\number\subsubsectionno
  390.         \fi\fi}}}\next
  391.         \edef\next{\write\frefs
  392.                 {\def\noexpand\escapeit rp@#1{\the\pageno}}}\next
  393.         }}
  394. \def\sref#1{{\catcode`\@=11 \toks0=\expandafter{\csname rs@#1\endcsname}\relax
  395.         \expandafter\ifx\the\toks0\relax
  396.                 [`#1']\write16{Label `#1' undefined on page \the\pageno.}\else
  397.                 \the\toks0 \fi
  398.         }}
  399. \def\pref#1{{\catcode`\@=11 \toks0=\expandafter{\csname rp@#1\endcsname}\relax
  400.         \expandafter\ifx\the\toks0\relax
  401.                 [`#1']\write16{Label `#1' undefined on page \the\pageno.}\else
  402.                 \the\toks0 \fi
  403.         }}
  404. % automatic numbering of figures
  405. \newcount\figureno \figureno=0
  406. \def\figure#1#2{\global\advance\figureno by 1 \centerline {\bf Fig.\
  407.         \the\figureno: #2}{\let\the=0\edef\next{\write\frefs
  408.                 {\def\noexpand\escapeit rf@#1{\number\figureno}}}\next
  409.         }}
  410. \def\fref#1{{\catcode`\@=11 \toks0=\expandafter{\csname rf@#1\endcsname}\relax
  411.         \expandafter\ifx\the\toks0\relax
  412.                 [`#1']\write16{Figure `#1' undefined on page \the\pageno.}\else
  413.                 \the\toks0 \fi
  414.         }}
  415. % \program macro for the comfortable typing of program texts
  416. \newdimen\pindent \pindent=0pt
  417. \newdimen\ppindent
  418. \newif\ifinb@x \inb@xfalse
  419. {\let\+=\undefined
  420. \gdef\program{\begingroup
  421.         \def\bb@x{\setbox0=\hbox\bgroup\inb@xtrue\ignorespaces}
  422.         \def\cr{\egroup \hbox {\hskip\leftskip \hskip\ppindent 
  423.                 \unhbox1 \unhbox0}
  424.                 \ppindent=\pindent
  425.                 \bb@x}
  426.         \def\+{\egroup \begingroup
  427.                 \def\endprogram{\errmessage{\noexpand\- inserted}
  428.                         \ifinb@x \egroup \fi \endgroup \endprogram}
  429.                 \advance \pindent by \wd0
  430.                 \setbox1=\hbox{\unhbox1 \unhbox0}
  431.                 \bb@x}
  432.         \def\-{\egroup \endgroup \ppindent=\pindent
  433.                 \bb@x}
  434.         \def\noalign##1{\egroup ##1\bb@x}
  435.         \def\endprogram{\ifinb@x \egroup \fi \endgroup}
  436.         \setbox1=\null
  437.         \ppindent=\pindent
  438.         \futurelet\next\pr@gram}
  439. \def\pr@gram{\ifx\next\obeylines \let\par=\cr 
  440.         \let\next=\pr@gr@m \obeylines \else \let\next=\relax \fi
  441.         \bb@x\next}
  442. \def\pr@gr@m{\let\next=}
  443. % macros for making framed boxes
  444. \long\def\gbox#1#2#3#4{\vbox{\hrule height#1 \hbox
  445.         {\vrule width#1\kern#3\vbox{
  446.         \kern#2 #4\ifhmode \par \fi \kern#2}\kern#3\vrule width#1}
  447.         \hrule height#1}
  448. \newdimen\boxedkern \boxedkern=12pt
  449. \newdimen\rulethickness \rulethickness=0.4pt
  450. \long\def\boxed#1{\gbox\rulethickness\boxedkern\boxedkern{
  451.         \advance\hsize by -\rulethickness
  452.         \advance\hsize by -\rulethickness
  453.         \advance\hsize by -\boxedkern
  454.         \advance\hsize by -\boxedkern
  455.         {\parskip=0pt \noindent}\ignorespaces #1}}
  456. \catcode`@=12 % disable use of private macros
  457.